#ifndef __FUZZYPID_H
#define __FUZZYPID_H

typedef enum
{
	NB=-3,//负大
	NM=-2,//负中
	NS=-1,//负小
	ZO=0,//零
	PS=1,//正小
	PM=2,//正中
	PB=3,//正大
}FuzzyPID_Domain;//论域枚举


typedef struct
{
	FuzzyPID_Domain Membership1;//隶属1
	float Degree1;//隶属度1
	FuzzyPID_Domain Membership2;//隶属2
	float Degree2;//隶属度2
}FuzzyPID_InputMembership;//Fuzzy_PID输入隶属度结构体

typedef struct
{
	FuzzyPID_Domain Membership1;//隶属1
	float Degree1;//隶属度1
	FuzzyPID_Domain Membership2;//隶属2
	float Degree2;//隶属度2
	FuzzyPID_Domain Membership3;//隶属3
	float Degree3;//隶属度3
	FuzzyPID_Domain Membership4;//隶属4
	float Degree4;//隶属度4
}FuzzyPID_OutputMembership;//Fuzzy_PID输出隶属度结构体

typedef struct
{
	float NeedValue;//预期值
	float NowValue;//现有值
	float t;//周期
	
	float e;//当前误差
	float e_1;//上一次误差
	float e_low;//误差为0阈值下限
	float e_up;//误差为0阈值上限
	float ec;//误差变化率de/dt
	float Sum_e;//误差之和
	float Del_e;//误差之差
	float e_Interval[2];//误差区间
	float ec_Interval[2];//误差变化率区间
	FuzzyPID_InputMembership e_Membership;//误差隶属度
	FuzzyPID_InputMembership ec_Membership;//误差变化率隶属度
	
	float Kp;//Kp
	float Ki;//Ki
	float Kd;//Kd
	float Kp_Interval[2];//Kp区间
	float Ki_Interval[2];//Ki区间
	float Kd_Interval[2];//Kd区间
	FuzzyPID_OutputMembership Kp_Membership;//Kp隶属度
	FuzzyPID_OutputMembership Ki_Membership;//Ki隶属度
	FuzzyPID_OutputMembership Kd_Membership;//Kd隶属度
	
	float IOut;//比例输出
	float POut;//积分输出
	float DOut;//微分输出
	
	float OUT;//总输出
	float OUT_low;//输出限幅下限
	float OUT_up;//输出限幅上限
}Fuzzy_PID;//Fuzzy_PID结构体

void FuzzyPID_PID(Fuzzy_PID *Fuzzy_PIDStructure,float NowValue);//模糊PID

#endif
